import re
import requests
from urllib.parse import unquote, urlparse, parse_qs
from .tool import remove_special_characters,write_log
from .logs_utils import *
from setting import *


def extract_or_return_url(input_url):
    """
    如果URL符合特定格式，则提取并返回'u'参数的值，否则返回原链接。
    参数:
    input_url (str): 要处理的URL字符串。

    返回:
    str: 提取的'u'参数的值（解码后），或原链接。
    """
    # 解析URL
    parsed_url = urlparse(input_url)
    # 检查URL的netloc部分是否符合特定格式
    if parsed_url.netloc in ["www.douban.com"] and parsed_url.path in ["/link2/"] or parsed_url.netloc in ["sec.douban.com"]:
        # 解析查询参数
        query_params = parse_qs(parsed_url.query)
        
        # 获取参数中的url值
        u_value = query_params.get('u')
        url_value = query_params.get('url')
        r_value = query_params.get('r')
    
        # 如果'u'参数存在且只有一个值，则返回解码后的值
        if u_value and len(u_value) == 1:
            return unquote(u_value[0])
        if url_value and len(url_value) == 1:
            return unquote(url_value[0])
        if r_value and len(r_value) == 1:
            return unquote(r_value[0])
    
    # 如果URL不符合特定格式，则返回原链接
    return input_url


def parse_url_get_info(url,db_url=''):
    
    headers = {
        'Content-Type': 'application/json',
    }
    
    json_data = {
        'content': f'{url}',
    }
    #解析产品接口
    response = requests.post(PARSE_PRODUCT, headers=headers, json=json_data,verify=False)
    
    res_js = response.json()
    #if  response.status_code!=200 or  res_js['data']['items']or res_js['data']['items'][0]['matchedPlatforms'][0]['status'] =="failure":
    #if  response.status_code!=200:

    # print(f"解析失败")
    is_ilog=False
    try:
        platform_name = res_js['data']['items'][0]['matchedPlatforms'][0]['platformName']
    except:
        platform_name = None
        is_ilog=True
    try:
        productId = res_js['data']['items'][0]['matchedPlatforms'][0]['data']['productInfo']['productId']
    except:
        productId = None
        is_ilog=True
    if  is_ilog:
        #写日志记录没有解析出来的产品url
        #print('记录解析不出来的产品url')
        print(f"记录解析不出来的产品url...")
        #print(url)
        noinfo={
            'url':url,
            'db_url':db_url
        }
        userId='no_parser_url'
        write_log(noinfo,userId)
        print(f"记录解析不出来的产品url {noinfo}")
        print(f"记录解析不出来的产品url...")
    return productId, platform_name


def get_platform(url):
    """
    """
    if "tmall.com" in url or "taobao.com" in url or "tb.cn" in url or "tmall.hk" in url:
        return "淘宝"
    elif "jd.com" in url or "3.cn" in url:
        return "京东"
    elif "pinduoduo.com" in url or "yangkeduo.com" in url:
        return "拼多多"
    elif "meituan.com" in url or "dpurl.cn" in url:
        return "美团"
    elif "vip.com" in url:
        return "唯品会"
    else:
        return "其他"


def isImg(url):
    return re.search(r'\.(jpg|jpeg|png|gif|bmp|webp|svg)(\?.*)?$', url, re.IGNORECASE) is not None


def get_redirect_url(url: str, max_redirects=10):
    """自动跟随所有重定向获取最终URL:ml-citation{ref="6,8" data="citationList"}
    :param url: 原始请求地址
    :param max_redirects: 最大重定向次数(默认10)
    :return: 最终地址字符串
    """
    # 如果长度小于这个长度 大概率是直链 无需重定向
    if len(url) < 50:
        return url
    parsed_url = urlparse(url)
    # 检查URL是否包含查询参数   跳过正文中"点击查看"这类图片的URL链接处理  刚好可以让后端用与微博相同的方式展示图片
    if not parsed_url.query:
        return url
    try:
        response = requests.get(
            url,
            allow_redirects=True,  # 启用自动重定向
            timeout=10,
            headers={
                'User-Agent': 'Mozilla/5.0',
            },
            verify=False,
            # max_redirects=max_redirects,
        )
        return response.url
    except requests.exceptions.TooManyRedirects:
        # raise ValueError("超出最大重定向次数限制")
        #print("重定向链接：超出最大重定向次数限制")
        logger.log(logging.INFO,f"重定向链接：超出最大重定向次数限制")
        return url
    except requests.exceptions.RequestException as e:
        # raise ConnectionError(f"请求失败: {str(e)}")
        #print("重定向链接：请求失败", url)
        logger.log(logging.INFO,f"重定向链接：请求失败{url}")
        return url 
